package com.zch.starter.metrics.prometheus.springboot.starter.instance.actuator;


import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;

import javax.annotation.Resource;
import java.util.concurrent.atomic.AtomicLong;

;

/**
 * 增强版的 心跳器 除了返回健康信息， 还可以发现 磁盘使用，cpu ,内存等情况（但生成环境现在不建议这么用了，都建议使用专业的普罗米修斯 或者APM 工具来做）
 *  * springboot 自带的 actuate 健康检测
 *  * //每次有第三方应用探测 调用http://localhost:9090/actuator/health 健康接口的时候都会触发health()方法
 */
@Deprecated
//@Component
public class EnhancedHealthIndicator implements HealthIndicator {
    // 健康时间
    private final AtomicLong lastHealthTime = new AtomicLong(System.currentTimeMillis());

    @Resource
    ServerResourceMonitor serverResourceMonitor;


    @Override
    public Health health() {
        try {
            // 检查磁盘空间
            Health diskHealth = serverResourceMonitor.getDiskHealth();
            //检查java 进程 CPU使用率
            double javaCpuUsage  = serverResourceMonitor.getJavaCpuLoad();
            //整个系统的 CPU 使用情况，包括所有的进程。
            double sysCpuUsage  = serverResourceMonitor.getSystemCpuLoad();
            // 检查内存使用
            Double javaMemoryUsage = serverResourceMonitor.getJavaMemoryUsage();
            Double systemMemoryUsage = serverResourceMonitor.getSystemMemoryUsage();
            Double diskSpaceUsage = serverResourceMonitor.getDiskSpaceUsage();
            long now = System.currentTimeMillis();
            lastHealthTime.set(now);
            //返回健康的同时附带些 cpu 内存 等使用指标数据(线上生成环境以及不推荐了，推荐使用更专业的 普罗米修斯 APM 工具来做资源监控)
            return Health.up()
                    .withDetail("disk", diskHealth.getDetails())//磁盘监控信息
                    .withDetail("javaCpuUsage",javaCpuUsage)
                    .withDetail("javaMemoryUsage", javaMemoryUsage)
                    .withDetail("systemMemoryUsage", systemMemoryUsage)
                    .withDetail("sysCpuUsage", sysCpuUsage)
                    .withDetail("diskSpaceUsage", diskSpaceUsage)
                    .build();
        } catch (Exception e) {
            return Health.down().withDetail("error", e.getMessage()).build();
        }
    }


}
